# -*- coding: utf-8 -*-
# @Time    : 2019/11/12
# @Author  : CHENlj
# @File    : Excel.py
import os, math
import pandas as pd
import numpy as np


class HandleExcel:
    # 项目目录
    project_path = os.path.abspath(os.path.join(os.path.dirname(__file__), os.path.pardir))
    # data文件夹路径
    data_path = os.path.join(project_path, 'Data')

    def read_excel_col(self, file_name, col_name, sheet_name=0, header=0):
        """
        读取指定excel文件指定的列的全部内容
        :param header:
        :param sheet_name: 表名
        :param file_name: excel文件名
        :param col_name: 列名
        :return: 指定列的全部数据（列表）
        """
        self.path = os.path.abspath(os.path.join(HandleExcel.data_path, file_name))
        if not os.path.exists(self.path):
            raise FileNotFoundError('请确认要读取的文件存在！')
        df = pd.read_excel(self.path, dtype=str, sheet_name=sheet_name, header=header)
        df[col_name] = df[col_name].replace(np.nan, '')
        return list(df[col_name])

    def read_excel_by_key(self, file_name, col1, col2, key, sheet_name=0):
        """
        通过指定列的关键词来查询另外一列对应的值
        :param sheet_name:
        :param file_name: 要读取的excel文件名
        :param col1: 查询关键词所在的列名
        :param col2: 查询结果所在的列名
        :param key: 查询的关键词
        :return:
        """
        self.path = os.path.abspath(os.path.join(HandleExcel.data_path, file_name))
        if not os.path.exists(self.path):
            raise FileNotFoundError('请确认要读取的文件存在！')
        df = pd.read_excel(self.path, sheet_name=sheet_name)
        # 打印所有隐藏的行
        pd.set_option('display.max_rows', None)
        pd.set_option('display.max_columns', None)
        key_list = []
        for temp in df[col1]:
            key_list.append(temp)
        # print(key_list)
        if key in key_list:
            # 返回col2列的信息,返回值为列表
            return list(df[df[col1].isin([key])][col2])
        else:
            return '关键词不存在'

    def read_excel_tuple(self, file_name, col1, col2, sheet_name=0):
        """
        查询指定两列数据，并将数据组成元组存入列表返回
        :param sheet_name:
        :param file_name: 读取的excel文件名
        :param col1: 查找的第一列列名
        :param col2: 查找的第二列列名
        :return: 元素为元组的列表
        """
        # 查询列1、列2的所有数据
        col1_list = self.read_excel_col(file_name=file_name, col_name=col1, sheet_name=sheet_name)
        col2_list = self.read_excel_col(file_name=file_name, col_name=col2, sheet_name=sheet_name)

        if len(col1_list) != len(col2_list):
            return '请确保数据存储格式正确'
        else:
            # print(key_list)
            report_data = []
            for i in range(len(col1_list)):
                # 将列1、列2对应的值组成元组存入列表
                report_data.append((col1_list[i], col2_list[i]))
            return report_data

    def read_excel_multi(self, file_name, *args, sheet_name=0, header=0):
        """
        查询不定列数，并将数据组成元祖存入列表返回
        :param header:
        :param sheet_name:
        :param file_name:
        :param args:
        :return:
        """
        self.path = os.path.abspath(os.path.join(HandleExcel.data_path, file_name))
        if not os.path.exists(self.path):
            raise FileNotFoundError('请确认要读取的文件存在！')
        df = pd.read_excel(self.path, dtype=str, sheet_name=sheet_name, header=header)
        df = df.replace(np.nan, '')
        df_data = df.loc[:, list(args)].values
        data_li = []
        for item in df_data:
            data_li.append(tuple(item))
        return data_li

    def append_excel(self, read_file_name, new_file_name, column, new_value, sheet_name=0):
        """
        追加Excel列, new_value以列表或元祖等可迭代对象传入
        :param sheet_name:
        :param read_file_name:
        :param new_file_name:
        :param column:
        :param new_value:
        :return:
        """
        self.read_path = os.path.abspath(os.path.join(HandleExcel.data_path, read_file_name))
        self.write_path = os.path.abspath(os.path.join(HandleExcel.data_path, new_file_name))
        if not os.path.exists(self.read_path):
            raise FileNotFoundError('请确认要读取的文件存在！')
        df = pd.read_excel(self.read_path, sheet_name=sheet_name)
        df[column] = new_value
        df.to_excel(self.write_path)

    def write_excel(self, file_name, data, cols):
        """
        写入excel
        :param file_name: 要保存的文件名
        :param data: 要保存的数据，以列表嵌套列表的形式传入，如[[1,2，3],[3,5，6]]
        :param cols: excel的字段名，以元组形式传入，如：('咨询问题', '实际返回', '期望返回')
        :return:
        """
        self.path = os.path.abspath(os.path.join(HandleExcel.data_path, file_name))
        data = pd.DataFrame(data=data, columns=cols)
        data.to_excel(self.path)

    def read_df(self, file_name, sheet_name=0, header=0):
        """
        读取Excel二维数组
        :param file_name:
        :param sheet_name:
        :param header:
        :return:
        """
        self.read_path = os.path.abspath(os.path.join(HandleExcel.data_path, file_name))
        df = pd.read_excel(self.read_path, sheet_name=sheet_name, header=header, dtype=str)
        df = df.replace(np.nan, '')
        return df


if __name__ == '__main__':
    r = HandleExcel()
    # data = r.read_excelxcel_col('test.xlsx', '请求头', header=2)
    data = r.read_excel_multi('test.xlsx', '用例名', '请求参数', sheet_name=0, header=5)
    # data = r.read_excel_multi('post_address.xlsx', 'address', 'currency_id', 'remark', 'memo')
    print(data)

    # r.write_excel('write_test.xlsx', [['qqq','www','eee'],['aaa','sss','ddd']], ('列1','列2','列3'))
    # ret = r.read_excel_by_key('put_address.xlsx','currency_id','currency_name',1120)
    # print(data)
    # new_value = (1,2,3,4,'ss')
    # r.append_excel('currency_id_test.xlsx', 'test1', new_value)